1-TANIMLAYICI İSTATİSTİKLER
VERI
cars=read_excel("C:/Users/Tarık/Desktop/Ders Notlarım/4. Sınıf/1. Dönem/Çok Değişkenli İstatistiksel Analiz/FİNAL/car_consumption.xls")- Kaynak: http://data-mining-tutorials.blogspot.com/2010/05/solutions-for-multicollinearity-in.html
- Aciklama: Farkli model arabalarin ozellikleri verilmistir.
Bagimli Degisken :
- Price: Arabanin fiyati
Aciklayici Degiskenler:
Cylinder: Arabanin silindir hacmi
Power: Arabanin gucu (beygiri)
Weight: Arabanin agirligi
Consumption: Yakit tuketimi
Gozlem Sayisi: 27
Aciklayici Degisken Sayisi: 4
cars1=cars %>% add_row(Model = "Peugeot 5008", Price = 179340, Cylinder = 6400, Power = 321, Weight = 5200, Consumption = 30.8) %>%
add_row(Model = "Ford Mustang", Price = 245250, Cylinder = 8500, Power = 457, Weight = 5100, Consumption = 50.1) %>%
add_row(Model = "Audi A5" , Price = 52200 , Weight = 1200 , Consumption = 8.5) %>%
add_row(Model = "Mercedes E250",Price = 245250, Power = 102)- 2. ve 3. kısımda calismaya uygun hale getirmek icin asiri ve eksik gozlemler iceren yeni satirlar eklendi. Daha sonra kullanilacak.
Verinin şu anki hali
profiling_num(cars)## variable mean std_dev variation_coef p_01 p_05
## 1 Price 28260.55556 12602.070826 0.4459244 10749.000 11867.00
## 2 Cylinder 1802.07407 634.420506 0.3520502 706.880 861.90
## 3 Power 78.14815 32.788018 0.4195623 29.780 32.00
## 4 Weight 1193.14815 314.205800 0.2633418 670.800 733.00
## 5 Consumption 9.12963 2.256242 0.2471340 5.726 5.89
## p_25 p_50 p_75 p_95 p_99 skewness kurtosis iqr
## 1 19615.00 25000.0 36775.00 50350.00 50874.000 0.40606425 2.003413 17160.0
## 2 1360.50 1983.0 2300.00 2819.70 2968.360 0.05348860 2.142632 939.5
## 3 54.50 85.0 99.00 125.00 143.500 0.20145571 2.263197 44.5
## 4 982.50 1140.0 1450.00 1659.50 1766.200 0.15874223 2.092423 467.5
## 5 6.95 9.2 11.05 12.46 12.774 0.02801713 1.689807 4.1
## range_98 range_80
## 1 [10749, 50874] [13234, 48340]
## 2 [706.88, 2968.36] [955.4, 2496.4]
## 3 [29.78, 143.5] [32.6, 123.2]
## 4 [670.8, 1766.2] [770, 1596]
## 5 [5.726, 12.774] [6.34, 11.78]
- Profiling_num komutu ile degiskenlerin ortalama, standart sapma, medyan vb. tanimlayici istatistikleri ozetlendi.
- Bu grafik ile verideki bütün araba modellerinin fiyatlarini gorebiliyoruz.
- Arabanin fiyat, beygir ve silindir degiskenleriyle 3 boyutlu sacilim grafigi cizdirildi. Beygir ve silindirin artmasi fiyati da arttiriyor.
- Degiskenler arasi iliski grafikleri cizdirildi, dogrusal ve pozitif iliskiler gozukuyor. Detayli olarak 5. kisimda bakilacak.
- Bu grafige bakildiginda yakit ve fiyat arasinda lineer pozitif bir iliski var. Ayni zamanda agirlik arttikca yakit ve fiyatin da arttigi goruluyor.
- Bazi silindir degerlerine gore fiyat degiskeni kutu grafigi cizildi. Sacilim grafinde yapilan yorumlar burda da gecerlidir.
2-EKSİK GÖZLEMLER
3 tane eksik gozlem cesidi vardir. Bunlar;
Tamamiyla Rastgele Kayip (Missing Completely at Random, MCAR)
Rastgele Eksik Gozlem (Missing at Random, MAR)
Rastgele Olmayan Kayıp (Missing Data Not At Random MNAR)
Normalde eksik gozlemlerin rastgele dagilip dagilmadigina bakmak icin R’in icinde bulunan TestMCARNormality veya LittleMCAR fonksiyonlari kullaniliyordu. Ancak son gelen guncellemeler ile bu paketler desteklenmiyor, manuel olarak okutmaya calisinca ise hatalar ile karsilasiliyor.
Calistigim veride eksik gozlem olmadigi icin ve manuel olarak kendim ekledigim icin bu gozlemlerin MCAR tipi eksik gozlem oldugunu biliyorum. Buna gore yapabilecegimiz duzeltmelere bakalim.
1- Ortalama ile Doldurma
apply(cars1,2,function(x) sum(is.na(x)))## Model Price Cylinder Power Weight Consumption
## 0 0 2 1 1 1
Bu komut ile hangi degiskenlerde kac tane eksik gozlem oldugunu gorebiliyoruz. Cylinder degiskeninde 2 tane eksik gozlem var. Bunlari ortalama ile dolduralim.
cars1$Cylinder=impute(cars1$Cylinder, mean)
tail(cars1)## # A tibble: 6 x 6
## Model Price Cylinder Power Weight Consumption
## <chr> <dbl> <impute> <dbl> <dbl> <dbl>
## 1 Toyota Previa salon 50900 2438.000 97 1800 12.8
## 2 Volvo 960 Kombi aut 49300 2473.000 125 1570 12.7
## 3 Peugeot 5008 179340 6400.000 321 5200 30.8
## 4 Ford Mustang 245250 8500.000 457 5100 50.1
## 5 Audi A5 52200 2191.586 NA 1200 8.5
## 6 Mercedes E250 245250 2191.586 102 NA NA
Eksik gozlemlere tekrar bakalim.
apply(cars1,2,function(x) sum(is.na(x)))## Model Price Cylinder Power Weight Consumption
## 0 0 0 1 1 1
tail(cars1$Cylinder)## 26 27 28 29 30 31
## 2438.000 2473.000 6400.000 8500.000 2191.586* 2191.586*
Goruldugu uzere Cylinder degiskenindeki eksik gozlemler ortalama ile doldurulmustur. (30 ve 31. gozlem)
+Veri boyutu kucuk oldugunda bu daha iyi bir yaklasimdir.
-Yanliligi ve hata performansini arttirir.
2- Eksik Gozlem Olan Satiri Silmek
cars1=na.omit(cars1)Bu kod ile eksik gozlem iceren satir direkt olarak veriden siliniyor.
apply(cars1,2,function(x) sum(is.na(x)))## Model Price Cylinder Power Weight Consumption
## 0 0 0 0 0 0
dim(cars1)## [1] 29 6
Goruldugu uzere veride eksik gozlem kalmamistir ancak 31 gozlemden 29 gozleme dusmus oldu. Eksik gozlem iceren satirlar silindi.
+Eksik degerlere sahip verilerin tamamen kaldirilmasi, saglam ve yuksek dogrulukta analiz saglar.
-Bilgi ve veri kaybi olusturur.
Bu yontemin benim verim icin gayet mantikli oldugunu dusunuyorum cunku 31 gozlemde 2 tanesinin eksik olmasi %6’lik bir kisma denk geliyor. Bu kadar az bir kismi silmek analizi cok fazla etkilemeyecektir.
3- Regresyon Modeli ile Doldurma
cars1$Cylinder[31]## [1] NA
Cylinder degiskeninin 31. gozlemi eksik gozlem gozukuyor.
model=lm(Cylinder~Power, data=cars1)
summary(model)##
## Call:
## lm(formula = Cylinder ~ Power, data = cars1)
##
## Residuals:
## Min 1Q Median 3Q Max
## -310.61 -131.60 -15.33 56.35 646.26
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 389.5737 53.7637 7.246 8.57e-08 ***
## Power 18.0950 0.4075 44.402 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 189.9 on 27 degrees of freedom
## (2 observations deleted due to missingness)
## Multiple R-squared: 0.9865, Adjusted R-squared: 0.986
## F-statistic: 1972 on 1 and 27 DF, p-value: < 2.2e-16
Cylinder ile Power degiskeni icin regresyon modeli kuruyoruz. Regresyon denklemimiz y=389.5737+18.0950.x oldu. Simdi bu gozlemi denklem sayesinde doldurabiliriz.
gosterge=function(t){x=dim(length(t))
x[which(!is.na(t))]=1
x[which(is.na(t))]=0
return(x)}
cars1$durum=gosterge(cars1$Cylinder)for(i in 1:nrow(cars1))
{if(cars1$durum[i]==0)
{cars1$Cylinder[i]=389.5737+18.0950*cars1$Power[i]}}cars1$Cylinder[31]## [1] 2235.264
Goruldugu uzere regresyon denklemi ile eksik olan gozlem yerine deger eklemis olduk.
+Model parametrelerinin tarafsiz tahminlerini verir.
-Varyans ve korelasyona dayali analizler uzerinde yanlilik yaratir.
3-AŞIRI GÖZLEMLER
Veride outliers olmadigini bildigim icin kendi ekledigim haliyle calisacagim.
Oncelikle eksik gozlemleri cikariyorum.
cars1=na.omit(cars1)Aykiri Gozlemleri Belirleme
- Butun degiskenlerin kutu grafigini cizdirdigimizde hepsinde iki tane degerin medyanin ve max degerlerin cok uzerinde oldugu gozukuyor. Bu degerlerin bizim ekledigimiz iki deger oldugunu biliyoruz ancak normalde boyle bir durum oldugunda asiri deger oldugundan suphelenmemiz gerekiyor.
- Ayni sekilde fiyat degiskenine gore diger degiskenlerin sacilim grafigini cizdirdigimizde iki ayri degerin aykiri oldugu cok acik gozukuyor.
## Remove outliers with left-click, stop with right-click on plotting device
## $outliers
## NULL
- Chi Square ile cizilen grafikte bir degerin aykiri gozlem oldugunu gosteriyor. Biz iki aykiri gozlemle calistigimizi dusunuyorduk. Bu durum bir outlierin digerini gizlemesi olabilir.
Regresyon modeli kurup model uzerinden bakalim.
model=lm(Price~Cylinder+Power+Weight+Consumption,data=cars1)
outlierTest(model)## No Studentized residuals with Bonferroni p < 0.05
## Largest |rstudent|:
## rstudent unadjusted p-value Bonferroni p
## 29 2.741435 0.011629 0.33725
- Bonferroni outlier test sonucuna gore 29. gozlem aykiri cikmistir.
hatv=hatvalues(model)
halfnorm(hatv,2,ylab="outliers")- Modelin sapka degerleri ile cizdirdigimiz bu grafik bize 28 ve 29. gozlemlerin asiri gozlem oldugunu gosteriyor.
Sonuc olarak kullandigimiz yontemler sonucunda asiri gozlemleri tespit edip veriye nasil bir etkisi oldugunu gorebiliyoruz
Aykiri Gozlemler icin Cozum Yontemleri
1- Aykiri Gozlemleri Cikarmak
Aykiri gozlemlerin olmadigi veri seti bizde tanimli olarak kullanima hazir.
Goruldugu uzere aykiri gozlemler veriden cikinca saglikli grafiklerle karsilasiyoruz.
- Sacilim grafiklerinden beygir ve fiyat olani secip aykiri gozlemleri cikardigimizda grafigin nasil degisecegine bakalim.
- Lineer bir artis oldugu icin aykiri gozlemler cizgiyi etkilemiyor. Aslinda bu tur gozlemlere leverage denebilir.
2- Aykiri Gozlemleri Ortalama ile Doldurmak
boxplot(cars1$Price,col="green")Goruldugu uzere fiyat degiskeninde asiri gozlemler var. Bunlari ortalama ile dolduralim.
a=which(cars1$Price %in% boxplot.stats(cars1$Price)$out)
cars1[a, ]$Price## [1] 179340 245250
Aykiri gozlemleri elde etmis olduk.
cars1[a, ]$Price=mean(cars1$Price)
boxplot(cars1$Price,col="green")Ortalama ile doldurup kutu grafigine tekrar baktigimizda aykiri gozlemsiz bir grafik elde etmis olduk. Ayni islemler diger degiskenlere de yapilip butun aykiri gozlemler duzeltilebilir.
3- Aykiri Gozlemleri Baskilamak
Bu yontemin mantigi aykiri gozlemleri verinin 3. ceyreklik degeri ile degistirmektir. Bunu uygulayalim.
a=which(cars1$Price %in% boxplot.stats(cars1$Price)$out)
cars1[a, ]$Price=fivenum(cars1$Price)[4]tail(cars1)## # A tibble: 6 x 5
## Price Cylinder Power Weight Consumption
## <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 26950 1997 92 1240 9.2
## 2 36400 1984 85 1635 11.6
## 3 50900 2438 97 1800 12.8
## 4 49300 2473 125 1570 12.7
## 5 38990 6400 321 5200 30.8
## 6 38990 8500 457 5100 50.1
Goruldugu uzere fiyat degiskeninin aykiri gozlem degerleri (5 ve 6. Price degeri) 3. ceyreklik degeri ile degistirildi. Ortalama ile degistirme yontemine cok benzer bir uygulama.
4- Logaritmik Donusum
Bu yontem asiri saga carpik dagilimlara uygulanmaktadir. Uygulanmasi kolay oldugu icin denememizi yapalim.
logcars=log(cars1)Log donusumu ile yeni bir veri seti olusturduk. Kutu grafiklerinde duzelme var mi bakalim.
Goruldugu uzere aykiri degerler hala bulunuyor. Log donusumu yontemi bu veri icin calismadi.
5-6 Karekok ve Ters Donusum
Log donusumu harici iki farkli donusum yontemimiz daha var. Bunlari da deneyelim.
Karekok Donusumu: Logaritma donusumu gibi dagilimin saga carpik oldugu durumlarda kullanilir. Bu yuzden bu yonteminde ise yarayacagini dusunmuyorum.
Ters Donusum: Asiri carpiklik durumunda kullanilir.
karecars=sqrt(cars1)
terscars=1/(cars1)par(mfrow=c(1,2))
boxplot(karecars$Price, main="Karekok Donusumu",ylab="Fiyat", col="orange")
boxplot(terscars$Price, main="Ters Donusum",ylab="Fiyat", col="red")Ongoruldugu uzere karekok donusumu aykiri gozlemlerle bas etmek konusunda yeterli olmadi.
Ters donusum ise iki aykiri gozlemden birini duzeltmeyi basardi. Ancak hala bir tane aykiri gozlem var.
4-DAĞILIMI İNCELEMEK
cars2=cars[,-1]- Power degiskeni (3. grafik) normalligi sagliyor gibi gozukuyor. Diger grafiklere baktigimizda pek saglikli durmuyor. Histogram grafigi ile de bakalim.
- Burada acik bir sekilde 3. grafik harici degisken grafiklerinin normalligi saglanmiyor. Emin olmak icin mvnorm ve shapiro testi kullanalim.
mvnorm.etest(cars2,R=10)##
## Energy test of multivariate normality: estimated parameters
##
## data: x, sample size 27, dimension 5, replicates 10
## E-statistic = 1.3004, p-value < 2.2e-16
mvnorm.etest(cars2,R=100)##
## Energy test of multivariate normality: estimated parameters
##
## data: x, sample size 27, dimension 5, replicates 100
## E-statistic = 1.3004, p-value = 0.03
mvnorm.etest(cars2,R=1000)##
## Energy test of multivariate normality: estimated parameters
##
## data: x, sample size 27, dimension 5, replicates 1000
## E-statistic = 1.3004, p-value = 0.021
- Mvnorm test sonuclarina gore p-value 0.05’den kucuk oldugu icin normallik saglanmiyor. Shapiro test ile de bakalim.
mshapiro.test(t(cars2))##
## Shapiro-Wilk normality test
##
## data: Z
## W = 0.83948, p-value = 0.0007182
- p=0.0007<0.05 normallik saglanmiyor. Verinin normal dagilimdan geldigini soyleyen yokluk hipotezi red edilir.
Price degiskenine log donusumu yaptigimizda normallige katkisinin olup olmadigini gorecegiz.
cars2$Price = log(cars2$Price)plotNormalHistogram(cars2$Price)- log donusumu yapildiktan sonra Price degiskeninin normallige biraz daha yaklastigi goruldu. Bakalim shapiro test sonuclarini etkiledi mi?
mshapiro.test(t(cars2))##
## Shapiro-Wilk normality test
##
## data: Z
## W = 0.84265, p-value = 0.0008269
- Cok cok az da olsa p-value degerinde yukselme var ancak yeterli degil ve yokluk hipotezi red ediliyor.
5-DEĞİŞKEN İLİŞKİLERİ
pairs.panels(cars2, scale=TRUE)Degiskenler arasinda cok yuksek iliskiler oldugu goruluyor. Neredeyse butun korelasyon katsayisi degerleri %90’nin uzerinde olmayanlar ise yakin gozukuyor.
Ve butun degiskenler arasinda dogrusal pozitif bir iliski var. Egrisel iliski gozukmuyor.
Coklu baglanti problemini incelemek icin regresyon modelini kurup VIF degerlerini incelememiz gerekiyor.
model=lm(Price~Cylinder+Power+Weight+Consumption,data=cars)
vif(model)## Cylinder Power Weight Consumption
## 14.491135 12.044308 9.426833 13.832198
VIF degerinin 10’dan buyuk olmasi coklu baglanti probleminden suphelenmemizi gerektirir. 3 degisken 10 degerini asiyor digeri ise 10’a cok yakin.
Bunun sonucunda coklu baglanti problemi bu veri icin vardir.